package ma.moliere.persistance.impl;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import org.apache.commons.collections.CollectionUtils;

import ma.moliere.persistance.HelpManager;
import ma.moliere.persistance.IElevePersistance;
import ma.moliere.persistance.oe.Absence;
import ma.moliere.persistance.oe.Eleve;
import ma.moliere.transverse.utils.AbscenceUtil;
import ma.moliere.transverse.utils.EleveUtils;
import ma.moliere.transverse.vo.AbsenceAffiche;
import ma.moliere.transverse.vo.CritereEleve;
import ma.moliere.transverse.vo.EleveAffiche;

public class ElevePersistanceImpl  implements IElevePersistance,Serializable  {

	/**
	 * 
	 */
	private static final long serialVersionUID = 6954775479554070625L;
	@PersistenceContext
	private EntityManager entityManager;
	
	@Override
	public EleveAffiche ajouter(EleveAffiche eleve) {
		Eleve entite = EleveUtils.copieVoVersOe(eleve);
		entityManager.persist(entite) ;
		return EleveUtils.copieOeVersVo(entite);
	}

	@Override
	public EleveAffiche modifier(EleveAffiche eleve) {
		Eleve entite = EleveUtils.copieVoVersOe(eleve);
		entityManager.merge(entite);
		entityManager.flush();
		return EleveUtils.copieOeVersVo(entite);
	}

	@Override
	public void supprimer(Long id) {
		// TODO Auto-generated method stub
		
	}

	


	@SuppressWarnings("unchecked")
	@Override
	public List<EleveAffiche> rechercher(CritereEleve critere) {
		
		final StringBuilder vRequete = new StringBuilder();
		List<EleveAffiche> eleves = new ArrayList<EleveAffiche>();
		vRequete.append(" SELECT eleve FROM Eleve eleve ");
		vRequete.append(" WHERE 1=1");
		
		if(critere!=null){
			if(critere.getId()!=null){
				vRequete.append("AND eleve.id =");
				vRequete.append(critere.getId());
			}
			if(critere.getMatricule()!=null && !critere.getMatricule().isEmpty()){
				vRequete.append("AND eleve.matricule =");
				vRequete.append("'"+critere.getMatricule()+"'");
			}
			if(critere.getNom()!=null && !critere.getNom().isEmpty() ){
				vRequete.append("AND eleve.nom =");
				vRequete.append("'"+critere.getNom()+"'");
			}
			if(critere.getPrenom()!=null && !critere.getPrenom().isEmpty()){
				vRequete.append("AND eleve.prenom =");
				vRequete.append("'"+critere.getPrenom()+"'");
			}
			if(critere.getNomMere()!=null && !critere.getNomMere().isEmpty()){
				vRequete.append("AND eleve.nommere =");
				vRequete.append("('"+critere.getNomMere()+"')");
				
			}
		}
		final Query vQuery = entityManager.createQuery(vRequete.toString());
		
		final List<Eleve> resultats= vQuery.getResultList();
		if(CollectionUtils.isNotEmpty(resultats)){
			for(Eleve temp : resultats){
				eleves.add(EleveUtils.copieOeVersVo(temp));
			}
		}

		entityManager.clear();
		
		
		
		return eleves;
	}

	@Override
	public Long compterEleves() {
		final StringBuilder vRequete = new StringBuilder();
		vRequete.append(" SELECT COUNT(DISTINCT eleve) FROM Eleve eleve ");
		final Query vQuery = entityManager.createQuery(vRequete.toString());
		Long nombre= (Long)vQuery.getSingleResult();
		entityManager.clear();
		return nombre;
	}

	@Override
	public AbsenceAffiche ajouter(AbsenceAffiche absence) {
		Absence entite = AbscenceUtil.copieVoVersOe(absence);
		entityManager.persist(entite) ;
		return AbscenceUtil.copieOeVersVo(entite);
	}

	@Override
	public AbsenceAffiche modifier(AbsenceAffiche absence) {
		
		Absence entite = AbscenceUtil.copieVoVersOe(absence);
		entityManager.merge(entite);
		entityManager.flush();
		return AbscenceUtil.copieOeVersVo(entite);
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<AbsenceAffiche> rechercher(String matricule, Long annee) {
		final StringBuilder vRequete = new StringBuilder();
		List<AbsenceAffiche> absences = new ArrayList<AbsenceAffiche>();
		
		vRequete.append(" SELECT absence FROM Absence absence ");
		vRequete.append(" WHERE 1=1 ");
		if(matricule!=null && !matricule.isEmpty()){
			vRequete.append("AND absence.matricule =");
			vRequete.append(matricule);
		}
		if(matricule!=null && !matricule.isEmpty()){
			vRequete.append("AND absence.anneescolaire =");
			vRequete.append(annee);
		}
		
		final Query vQuery = entityManager.createQuery(vRequete.toString());
		
		final List<Absence> resultats= vQuery.getResultList();
		if(CollectionUtils.isNotEmpty(resultats)){
			for(Absence temp : resultats){
				absences.add(AbscenceUtil.copieOeVersVo(temp));
			}
		}
		entityManager.clear();
		return absences;
	}

}
